<?


abstract class JCATProjectBase extends CoderBase
{
	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	array
	 */
	public function JCATProjectBase()
	{
		$this->CoderBase(__CLASS__) ;

		array(
			array(JCAT_Language::Sentence('类'),'Classes/')
			, array(JCAT_Language::Sentence('数据'),'Data/')
			, array(JCAT_Language::Sentence('资源'),'Data/')
			, array(JCAT_Language::Sentence('语言包'),'Resource/Language/') 
			, array(JCAT_Language::Sentence('UI模版'),'Resource/UITemplate/') 
			, array(JCAT_Language::Sentence('图像'),'Resource/Image/') 
		) ;
	}

	/**
	 * 初始化相关的 MVC 对象
	 * 
	 * @access	public
	 * @return	void
	 */
	public function Initialize( JCATProjectDocBase $aDoc )
	{		
		// 视图 JCATInfoView
		$aView = new JCATInfoView($this) ;
		$aView->SetDocument($aDoc) ;
		$this->AddView($aView) ;
		$this->AddView($aView) ;

		// 视图 JCATLibraryView
		$aView = new JCATLibraryView($this) ;
		$aView->SetDocument($aDoc) ;
		$this->AddView($aView) ;

		// 视图 PrimaryDBAndLanguageView
		$aView = new PrimaryDBAndLanguageView($this) ;
		$aView->SetDocument($aDoc) ;
		$this->AddView($aView) ;

		// 父类的初始化函数
		parent::Initialize($aDoc) ;
	}


	/**
	 * 
	 *
	 * @access	public
	 * @return	void
	 */
	public function MainRun($arrArgv=array())
	{		
		// 移交给父类
		parent::MainRun(&$arrArgv) ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	string
	 */
	public function GetPath()
	{
		$aView = $this->GetView('JCATInfoView') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aView,'JCATInfoView') ;
		
		$sPath = $aView->GetProjectDir() ;
		
	
		if( is_file($sPath) )
		{ 
			return $sPath ;
		}
		
		else if( is_dir($sPath) )
		{			
			$sDir = JCAT_Global::TidyPath($sPath) ;
			return $sDir.self::JCAT_INIT_FILENAME ;
		}
		
		else
		{
			return null ;
		}
	}
	
	
	/**
	 * 将一个存在的目录引入到一个JCAT项目中
	 * 
	 * @access	public
	 * @param 	$sDirPath			string
	 * @param 	$sProjectInitFile	string
	 * @return	bool
	 * @static
	 */
	static public function ImportDirectory($sDirPath,$sProjectInitFile)
	{
		if( is_dir($sProjectInitFile) )
		{
			$sInitFile = JCAT_Global::TidyPath($sProjectInitFile).self::JCAT_INIT_FILENAME ;
		}
		
		else
		{
			$sInitFile =& $sProjectInitFile ;
		}
		
		$sPathFile = JCAT_Global::TidyPath($sDirPath). 'inc.PATH.php' ;
		
		// 检查项目
		if( !is_file($sInitFile) )
		{
			throw new JCAT_Exception(JCAT_Language::Sentence("项目不存在，或不是一个JCAT项目：\r\n%s",$sInitFile)) ;
			//return false ;
		}
		
		// 检查目录
		if( !is_dir($sDirPath) )
		{
			throw new JCAT_Exception(JCAT_Language::Sentence('目录不存在：“%s”',$sDirPath)) ;
		}
		
		if( is_file($sPathFile) )
		{
			throw new JCAT_Exception(JCAT_Language::Sentence('目录已经隶属于某个JCAT项目，请接触和该项目的隶属关系。',$sDirPath)) ;
		}
		
		$sRelative = JCAT_FSO::GetRelativePath($sDirPath,$sInitFile) ;
		if($sRelative===NULL)
		{
			throw new JCAT_Exception(JCAT_Language::Sentence("无法将指定目录：\r\n%s\r\n引入到项目中：%s\r\n\r\n。如果是在Windows平台，需要它们在同一分区内。",$sDirPath,$sProjectInitFile)) ;			
		}
		
		// 创建 PATH 文件
		$sContent = "<?
/**
 * !注意：如果删除此文件，将无法在当前目录使用 JCAT PHP Framework
 *
 */
require_once dirname(__FILE__).'/%s' ;

?>" ;
		$sContent = JCAT_Language::Sentence($sContent,$sRelative) ;
		
		file_put_contents($sPathFile,$sContent) ;

	}
	
	
	/**
	 * 根据JCAT项目的一个子路径 查询到 所属JCAT项目的主目录
	 * 
	 * @access	public
	 * @param 	$sProjectChildPath	string	项目的子目录 或 项目所属文件 的 路径
	 * @return	string,null
	 * @static
	 */
	static public function QueryProjectMainDirectory( $sProjectChildPath )
	{
		// 依赖 PDR
		JCAT_Package::ImportClass('JCAT_PDR',JCAT::PACKAGE_APP) ;
		if( !JCAT_PDR::HasInstalled() )
		{
			return null ;
		}
		
		// 检查子路径是否存在
		if( !file_exists($sProjectChildPath) )
		{
			return null ;
		}
		
		// inc.PATH.php 文件
		if( is_file($sProjectChildPath) )
		{
			$sPath = dirname($sProjectChildPath).'/'.self::JCAT_PATH_FILENAME ;
		}
		else
		{
			$sPath = JCAT_Global::TidyPath($sProjectChildPath).self::JCAT_PATH_FILENAME ;
		}
		
		if( !is_file($sPath) )
		{
			return null ;
		}
		
		// 调用  QueryProjectMainDirectory.php 脚本
		$sRet = JCAT_PDR::RunScript( dirname(__FILE__).'/QueryProjectMainDirectory.php', array($sPath) ) ;
		
		$arrRes = array() ;
		if( preg_match('/^The Project Main Directory:(.+)$/s',$sRet,$arrRes) )
		{
			return $arrRes[1] ;
		}
		
		else
		{
			return null ;
		}
	}
	
	// 属性 /////////////////////////////////////////////
	
	
	const JCAT_INIT_FILENAME = 'inc.JCAT_Initialize.php' ;
	
	const JCAT_PATH_FILENAME = 'inc.PATH.php' ;
}

?>